#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
#include<inttypes.h>
#include"przeksztalcenia2.h"

/* Dwie duże liczby pseudopierwsze */
const unsigned char * const gg="adc0f13a0ce06b253c26b21be3ba47f6dc65238c6fdca4da2b0c89a995af87c0481c2e6adb02474114bef96d0aa229058b7ec91940c365c04a00e409dcd2469b";
const unsigned char * const pp="ea8434f51293b3c2cd231d5c4e61116836711dca76c0bc57cfed21977746712844033377961e2fe83e6ab265f4ede4b9d158a1c32534c8ba40e65936130589f5";

uint8_t doSzyfrowania[5]={65,66,67,68,69};
uint8_t zaszyfrowane[5];
uint8_t odszyfrowane[5];

mpz_t G;
mpz_t P;
mpz_t klucz_oryginalny;
mpz_t klucz_aktualny;

size_t ile;
uint8_t tablica[128];
uint8_t tablica2[128];

int main(int argc, char *argv[])
{
   unsigned int i;
   inicjalizuj();
   mpz_init(G);
   mpz_init(P);
   mpz_set_str(G,gg,16);
   mpz_set_str(P,pp,16);
   ustawG(G);
   ustawP(P);
   /*Po tym biblioteka gotowa do użycia*/

   /*Poniższe normalnie będzie robił klient, jest to generowanie klucza*/
   mpz_init(klucz_oryginalny);
   mpz_init(klucz_aktualny);
   
   do
   {
      generujPierwsza(klucz_oryginalny);
   }
   while((mpz_cmp(klucz_oryginalny,G)==0) || (mpz_cmp(klucz_oryginalny,P)==0));
   /*Jak tu jesteśmy to klucz wygenerowany*/

   /*Załóżmy, że potrrzebujemy skonwertować klucz na tablice bajtów*/
   mpz_export(tablica,&ile,1,sizeof(uint8_t),1,0,klucz_oryginalny);
   printf("%u\n",ile);
   /*W drugą stronę*/
   mpz_import(klucz_oryginalny,128,1,sizeof(uint8_t),1,0,tablica);
   /*Koniec*/

   /*Tylko żebyć sobie zobaczył na konsoli napis*/
   for(i=0; i<sizeof(doSzyfrowania); ++i)
   {
      putchar(doSzyfrowania[i]);
   }
   putchar('\n');
   /*szyfrowanie*/
   mpz_set(klucz_aktualny,klucz_oryginalny);
   for(i=0; i<sizeof(doSzyfrowania); ++i)
   {
      zaszyfrowane[i]=szydefruj2(doSzyfrowania[i],klucz_aktualny);
      putchar(zaszyfrowane[i]);
   }
   putchar('\n');
   mpz_set(klucz_aktualny,klucz_oryginalny);
   /*Tylko żebyć sobie zobaczył na konsoli napis*/
   for(i=0; i<sizeof(doSzyfrowania); ++i)
   {
      odszyfrowane[i]=szydefruj2(zaszyfrowane[i],klucz_aktualny);
      putchar(odszyfrowane[i]);
   }
   putchar('\n');
   /* Gdy liczby niepotrzebne można je wyczyścić */
   mpz_clear(G);
   mpz_clear(P);
   mpz_clear(klucz_oryginalny);
   mpz_clear(klucz_aktualny);
   return EXIT_SUCCESS;
}
